home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / FRMPROGR.C < prev    next >
C/C++ Source or Header  |  1992-04-05  |  15KB  |  395 lines

  1.  
  2. /*************************************************************************
  3.  * FRMDSMEN.C - The frm_dsmenu() routine.
  4.  *************************************************************************/
  5.  
  6. #include <stdarg.h>
  7. #include "gemfast.h"
  8. #include "frmtypes.h"
  9.  
  10. #ifndef NULL
  11.   #define NULL 0L
  12. #endif
  13.  
  14. #ifndef TRUE
  15.   #define TRUE  1
  16.   #define FALSE 0
  17. #endif 
  18.  
  19. /*-------------------------------------------------------------------------
  20.  * The tedinfos for the dialog body text.  
  21.  *   We have to use our own tedinfos instead of sharing the common array
  22.  *   of them in FRMNLDSU.C, because we're non-modal, and other users of
  23.  *   the common array can be invoked while the progress display is up.
  24.  *-----------------------------------------------------------------------*/
  25.  
  26. static TEDINFO local_tedinfos[] = {
  27.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  28.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  29.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  30.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  31.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  32.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  33.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  34.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  35.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1},
  36.   {NULL, NULL, NULL, 3, 6, 0, 0x11F0, 0,  0,   1,   1}
  37. };                                                                    
  38.  
  39. /*------------------------------------------------------------------------
  40.  * the dialog tree...
  41.  *-----------------------------------------------------------------------*/
  42.  
  43. #define OUTLINED_BOX_SPEC 0x00021100L
  44. #define SHADOWED_BOX_SPEC 0x00FF1100L
  45.  
  46. static OBJECT progress_dialog[] = {
  47.  { -1,  1, 13, G_BOX,      NONE,       OUTLINED, 0x00021100L, 0x0000, 0x0000, 0x0001, 0x0000},
  48.  { 12,  2, 11, G_IBOX,     NONE,       NORMAL,   0x00001100L, 0x0001, 0x0000, 0x0001, 0x0000},
  49.  {  3, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0001, 0x0001, 0x0001},
  50.  {  4, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0002, 0x0001, 0x0001},
  51.  {  5, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0003, 0x0001, 0x0001},
  52.  {  6, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0004, 0x0001, 0x0001},
  53.  {  7, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0005, 0x0001, 0x0001},
  54.  {  8, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0006, 0x0001, 0x0001},
  55.  {  9, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0007, 0x0001, 0x0001},
  56.  { 10, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0008, 0x0001, 0x0001},
  57.  { 11, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x0009, 0x0001, 0x0001},
  58.  {  1, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   0L,          0x0000, 0x000A, 0x0001, 0x0001},
  59.  { 13, -1, -1, G_BOX,      NONE,       NORMAL,   0x00FF1131L, 0x0001, 0x0000, 0x0001, 0x0001},
  60.  {  0, -1, -1, G_BUTTON,   0x0027,     NORMAL,   0L,          0x0000, 0x0000, 0x0001, 0x0001}
  61. };                                                                                              
  62.  
  63. #define TEXT_BOX        1
  64. #define FIRST_TEXT_LINE 2                                                                                             
  65. #define THERMO_BAR      12
  66. #define EXIT_BUTTON     13
  67.  
  68. #define MAXLINES Array_els(local_tedinfos)
  69.  
  70. /*------------------------------------------------------------------------
  71.  * misc static data...
  72.  *-----------------------------------------------------------------------*/
  73.  
  74. static FormControl progress_ctl;
  75. static int         initdone = FALSE;
  76. static char        *formatted_text;
  77. static int         lastline;
  78. static int         oldmouse;
  79.  
  80. /*------------------------------------------------------------------------
  81.  * dummy_do - The form_do() handler when the dialog isn't abortable.
  82.  *-----------------------------------------------------------------------*/
  83.  
  84. static int dummy_do(ctl)
  85.     FormControl *ctl;
  86. {
  87.     return NO_OBJECT;
  88. }
  89.  
  90. /*------------------------------------------------------------------------
  91.  * watchbutton_do - The form_do() handler to watch the abort button.
  92.  *  This is a non-modal handler.  It checks the keyboard and mouse button,
  93.  *  and if neither is active, it returns NO_OBJECT.
  94.  *-----------------------------------------------------------------------*/
  95.  
  96. static int watchbutton_do(ctl)
  97.     FormControl *ctl;
  98. {
  99.     int    obj;
  100.     int    mouseobj;
  101.     XMULTI xm;
  102.     
  103.     xm.mflags    = MU_BUTTON | MU_KEYBD | MU_TIMER;
  104.     xm.mbstate   = 1;
  105.     xm.mbmask    = 1;
  106.     xm.mbclicks  = 1;
  107.     xm.mtlocount = 1;
  108.     xm.mthicount = 0;
  109.     
  110.     
  111.     obj = NO_OBJECT;
  112.     evnx_multi(&xm);
  113.     
  114.     if ((xm.mwhich & MU_KEYBD)
  115.      && (xm.mkreturn & 0x00FF) == '\r') {
  116.         obj = EXIT_BUTTON;
  117.         obj_stchange(ctl->ptree, obj, SELECTED, OBJ_CLIPDRAW, ctl->pboundrect);
  118.     }
  119.     
  120.     if (xm.mwhich & MU_BUTTON) {
  121.         mouseobj = objc_find(ctl->ptree, ROOT, MAX_DEPTH, xm.mmox, xm.mmoy);
  122.         if (mouseobj == NO_OBJECT) {
  123.             gemdos(2, 7); // ding!
  124.         } else if (mouseobj == EXIT_BUTTON) {
  125.             if (graf_watchbox(ctl->ptree, EXIT_BUTTON, SELECTED, NORMAL)) {
  126.                 obj = EXIT_BUTTON;
  127.             }
  128.         } else if (mouseobj == ctl->moverobj) {
  129.             obj = mouseobj;
  130.         }
  131.     }
  132.     
  133.     return obj;
  134. }
  135.  
  136. /*------------------------------------------------------------------------
  137.  * setup_dialog - Construct the dynamic dialog, paint it.
  138.  *-----------------------------------------------------------------------*/
  139.  
  140. static int setup_dialog(options, increments, button, fmt, args)
  141.     long        options;
  142.     int         increments;
  143.     char       *button;
  144.     char       *fmt;
  145.     va_list     args;
  146. {
  147.     int              status;
  148.     int              numlines;
  149.     int              numbuttons;
  150.     int              maxwidth;
  151.     int              btnwidth;
  152.     int              cumulative_height;
  153.     int              wchar  = gl_wchar;
  154.     int              hchar2 = gl_hchar * 2;
  155.     char            *strptrs[MAXLINES+1];
  156.     char            *strpatches[MAXLINES+1];
  157.     register OBJECT *ptree = progress_dialog;
  158.  
  159.     /*--------------------------------------------------------------------
  160.      * do one-time init, validate parms, merge in default options.
  161.      *-------------------------------------------------------------------*/
  162.  
  163.     if (!initdone) {
  164.         initdone = TRUE;
  165.         rsc_treefix(ptree);
  166.         if (0 != (status = obj_mkthermo(ptree, THERMO_BAR, 1))) {
  167.             return status;
  168.         }
  169.     }
  170.  
  171.     if (progress_ctl.ptree != NULL) {
  172.         return -36;
  173.     }
  174.  
  175.     if (increments >= gl_rwdesk.g_w) {
  176.         return -64;
  177.     } 
  178.     
  179.     if (!(options & FRM_NODEFAULTS)) {
  180.         options |= _FrmDefaults | (FRM_DEFAULT_DYNOPT & ~FRM_MOUSEARROW);
  181.     }
  182.     options |= FRM_MANDATORY_DYNOPT;
  183.  
  184.     /*--------------------------------------------------------------------
  185.      * if a button was specified, its string is the initial maxwidth.
  186.      *-------------------------------------------------------------------*/
  187.  
  188.     if (button == NULL) {   
  189.         maxwidth = btnwidth = 0;
  190.     } else {
  191.         maxwidth = btnwidth = strlen(button) + 2;
  192.     }
  193.  
  194.     /*--------------------------------------------------------------------
  195.      * format the text and load it into the dialog objects.
  196.      * save a pointer to the string pointer for the last text line.
  197.      * this lets easily change the last line of text during an update.
  198.      *-------------------------------------------------------------------*/
  199.  
  200.     formatted_text = _FrmVFormat(fmt, args, NULL);
  201.     
  202.     _FrmNL2DS(formatted_text, strptrs, strpatches, MAXLINES);
  203.     numlines = _FrmDS2Obj(strptrs, &ptree[FIRST_TEXT_LINE], local_tedinfos,
  204.                             &maxwidth, MAXLINES);
  205.  
  206.     lastline = TEXT_BOX + numlines;
  207.  
  208.     /*--------------------------------------------------------------------
  209.      * from this point on, widths are pixels, no